From 084dedfee399bf41d12df75873b2f49b2ebd539d Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 29 Jul 2005 10:36:53 +0000 Subject: [PATCH] This patch does 2 jobs: - Enforce the number of CPUs dom0 will take. See the new variable "dom0-cpus" in xend-config.sxp (you will want to set this variable to 1 on SMP systems) - Balloon out dom0 memory when creating domU, if there is not enough free memory. The lowest level we will balloon out is configured via the new variable "dom0-min-mem" in xend-config.sxp I still have a doubt: where to put the code to enforce dom0-cpus. At the moment I put it into python/xen/xend/server/SrvDaemon.py, and hopefully that is resonable enough. Any comment? Signed-off-by: Nguyen Anh Quynh --- tools/examples/xend-config.sxp | 8 +++++ tools/python/xen/xend/XendRoot.py | 10 ++++++ tools/python/xen/xend/server/SrvDaemon.py | 30 +++++++++++++++++- tools/python/xen/xm/create.py | 38 +++++++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) diff --git a/tools/examples/xend-config.sxp b/tools/examples/xend-config.sxp index 8d670c3d16..d8914d320d 100644 --- a/tools/examples/xend-config.sxp +++ b/tools/examples/xend-config.sxp @@ -44,3 +44,11 @@ # Setup script for enbd-backed block devices (block-enbd block-enbd) +# Dom0 will balloon out when needed to free memory for domU. +# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to. +# If dom0-min-mem=0, dom0 will never balloon out. +(dom0-min-mem 0) + +# In SMP system, dom0 will use only CPUs in range [1,dom0-cpus] +# If dom0-cpus = 0, dom0 will take all cpus available +(dom0-cpus 0) diff --git a/tools/python/xen/xend/XendRoot.py b/tools/python/xen/xend/XendRoot.py index 045a5a5fa4..3d3767f9ba 100644 --- a/tools/python/xen/xend/XendRoot.py +++ b/tools/python/xen/xend/XendRoot.py @@ -76,6 +76,10 @@ class XendRoot: """Default port xend serves consoles at. """ console_port_base_default = '9600' + dom0_min_mem_default = '0' + + dom0_cpus_default = '0' + components = {} def __init__(self): @@ -329,6 +333,12 @@ class XendRoot: def get_vif_antispoof(self): return self.get_config_bool('vif-antispoof', 'yes') + def get_dom0_min_mem(self): + return self.get_config_int('dom0-min-mem', self.dom0_min_mem_default) + + def get_dom0_cpus(self): + return self.get_config_int('dom0-cpus', self.dom0_cpus_default) + def instance(): """Get an instance of XendRoot. Use this instead of the constructor. diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index 134075821b..c808b19ae1 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -5,7 +5,6 @@ ########################################################### import os -import os.path import signal import sys import threading @@ -16,6 +15,7 @@ import re import StringIO import traceback import time +import glob from xen.lowlevel import xu @@ -25,6 +25,7 @@ from xen.xend import EventServer; eserver = EventServer.instance() from xen.xend.XendError import XendError from xen.xend.server import SrvServer from xen.xend.XendLogging import log +from xen.xend import XendRoot; xroot = XendRoot.instance() import channel import controller @@ -327,6 +328,7 @@ class Daemon: return self.cleanup(kill=True) def run(self): + _enforce_dom0_cpus() try: log.info("Xend Daemon started") self.createFactories() @@ -363,6 +365,32 @@ class Daemon: #sys.exit(rc) os._exit(rc) +def _enforce_dom0_cpus(): + dn = xroot.get_dom0_cpus() + + for d in glob.glob("/sys/devices/system/cpu/cpu*"): + cpu = int(os.path.basename(d)[3:]) + if (dn == 0) or (cpu < dn): + v = "1" + else: + v = "0" + try: + f = open("%s/online" %d, "r+") + c = f.read(1) + if (c != v): + if v == "0": + log.info("dom0 is trying to give back cpu %d", cpu) + else: + log.info("dom0 is trying to take cpu %d", cpu) + f.seek(0) + f.write(v) + f.close() + log.info("dom0 successfully enforced cpu %d", cpu) + else: + f.close() + except: + pass + def instance(): global inst try: diff --git a/tools/python/xen/xm/create.py b/tools/python/xen/xm/create.py index 2b86d03676..6b4d8a27ed 100644 --- a/tools/python/xen/xm/create.py +++ b/tools/python/xen/xm/create.py @@ -1,4 +1,5 @@ # Copyright (C) 2004 Mike Wray +# Copyright (C) 2005 Nguyen Anh Quynh """Domain creation. """ @@ -7,10 +8,13 @@ import string import sys import socket +import xen.lowlevel.xc + from xen.xend import sxp from xen.xend import PrettyPrint from xen.xend.XendClient import server, XendError from xen.xend.XendBootloader import bootloader +from xen.xend import XendRoot; xroot = XendRoot.instance() from xen.util import blkif from xen.util import console_client @@ -644,6 +648,36 @@ def make_domain(opts, config): % (dom, console_port)) return (dom, console_port) +def get_dom0_alloc(): + """Return current allocation memory of dom0 (in MB). Return 0 on error""" + PROC_XEN_BALLOON = "/proc/xen/balloon" + + f = open(PROC_XEN_BALLOON, "r") + line = f.readline() + for x in line.split(): + for n in x: + if not n.isdigit(): + break + else: + f.close() + return int(x)/1024 + f.close() + return 0 + +def balloon_out(dom0_min_mem, opts): + """Balloon out to get memory for domU, if necessarily""" + SLACK = 4 + + xc = xen.lowlevel.xc.new() + pinfo = xc.physinfo() + free_mem = pinfo['free_pages']/256 + if free_mem < opts.vals.memory + SLACK: + need_mem = opts.vals.memory + SLACK - free_mem + cur_alloc = get_dom0_alloc() + if cur_alloc - need_mem >= dom0_min_mem: + server.xend_domain_mem_target_set(0, cur_alloc - need_mem) + del xc + def main(argv): opts = gopts args = opts.parse(argv) @@ -671,6 +705,10 @@ def main(argv): if opts.vals.dryrun: PrettyPrint.prettyprint(config) else: + dom0_min_mem = xroot.get_dom0_min_mem() + if dom0_min_mem != 0: + balloon_out(dom0_min_mem, opts) + (dom, console) = make_domain(opts, config) if opts.vals.console_autoconnect: path = "/var/lib/xend/console-%s" % console -- 2.30.2